
//---------------在方法内部不能【定义】static修饰的变量

//---------------------------------------------------

//继承：对共性进行抽取使代码可以复用

package com.zijie.demo1;

//父类、基类、超类
class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println(name+" 正在吃饭！");
    }
}


//子类、派生类
class Dog extends Animal{

    public int count;
    public void wangwang() {
        System.out.println(name+"汪汪汪~~~");
    }
}

class Cat extends Animal{
    public void miaomiao() {
        System.out.println(name+ "喵喵喵~~~");
    }
}

//注：
//0、is-a关系：class Dog extends Animal
//1、子类有 那么就拿子类的 子类没 那么就拿父类的
//2、在子类方法中，或者通过子类对象访问成员时：
//父类和子类有同名的成员变量，优先访问子类自己的（就近原则）
//如果非要访问父类中的同名成员变量，可以使用关键字super.变量名
////暂且理解为代表父类对象的引用。可以访问当前子类父类的成员
//3、在子类方法中访问父类方法时：如果父类和子类的成员方法名相同，优先访问子类自己的（就近原则）
//如果非要访问父类中的同名成员变量，可以使用关键字super.方法名
//同时构成重载（不是说一定在同一个类当中，如果是继承关系上，此时也可以看做是重载）

//super（不能指向爷爷类）
//1、super.data在子类中访问父类的成员变量
//2、super.func()在子类中访问父类的成员方法
//正确的理解：super只是一个关键字。最大的作用其实就是在你写代码或者读代码的时候，体现出更好的可读性！
//注意：
//1、只能在非静态方法中使用（this 和 super都不可以在静态方法中使用，都与对象有关）
//2、在子类方法中，访问父类的成员变量和方法

//构造方法
//在继承关系上，当我们在构造子类的时候，一定要先帮助父类进行构造
//super在子类构造方法内 调用父类构造方法的时候，一定放在第一行
//构造方法中不能同时出现super/this都只能出现在非静态方法中
//不给super();不报错，默认会给super();

//当父类和子类都没有提供任何的构造方法的时候：
//父类：public Animal(){……}
//子类：public Dog(){super(); ……}

//当父类子类中同时存在静态代码块、实例代码块、构造方法时：
//父类优先+静态优先：父类的静态-》子类的静态-》父类实例+构造-》子类实例+构造

//protected修饰符：类内、包内、包外子类
//private修饰的成员也可以被继承，只不过不能访问
//private<默认<protected<public

//final关键字
//当一个类被final修饰后，称为密封类。就不能被继承了（绝育了）
//final修饰变量->变量名大写->此时为常量
//final修饰成员变量，语法规定，必须同时给定一个初始值！
//一个例子：final int[] array={1,2,3};
//此时array这个引用指向的对象是不能改变的，但是可以改变里面的值。
//array=new int[10];//error
//array[0]=19;//right

//组合是一种代码的实现方式，设计思想。a-part-of/has-a

public class Test1 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "大黄";
        dog.eat();
        dog.wangwang();

        System.out.println("=================");
        Cat cat = new Cat();
        cat.name = "小白";
        cat.eat();
        cat.miaomiao();
    }
}

